在部分非桌面芯片中,是无法通过
apt install来按照perf的,所以我们需要交叉编译,这里的环境是:
- A40i,Linux5.10.149,QT5.10(飞凌)
- Ubuntu
想通过源码来编译perf工具,有两个方法:
- 通过
buildroot来编译,因为perf是用户层程序 - 通过
kernel下tools进行编译
尝试第一种(buildroot)
我们通过:./build.sh buildroot_menuconfig进入buildroot的配置: 

新名字叫BR2_LINUX_KERNEL_TOOL_PERF,我们来开启试试,按1进入配置,发现无法配置,看到它还有其他的依赖:BR2_LINUX_KERNEL。这个应该是在buildroot中开启Linux内核,但是我们的内核是外部的(厂家有自定义代码),所以看看是否能引入外部kernel。我们开启这个选项: 
按Y后有许多配置,来看看是否有设置外部kernel选项。 找了一圈,并没有找到设置本地kernel的选项,只有设置git仓库,那这种办法是无可能了。
尝试第二种(Kernel)
这里通过内核来编译perf工具,我们先需要知道当前的脚本的编译参数是什么,我们查看build.sh文件获取编译内核时,具体执行了什么代码。 

这里加一下打印: 

加了一条打印,然后编译看看: 
make CROSS_COMPILE=/home/forlinx/work2/OKA40i-linux-sdk/out/toolchain/gcc-linaro-5.3.1-2016.05-x86_64_arm-linux-gnueabi/bin/arm-linux-gnueabi- ARCH=arm -j8 O=/home/forlinx/work2/OKA40i-linux-sdk/out/a40i_h/kernel/build KERNEL_SRC=/home/forlinx/work2/OKA40i-linux-sdk/kernel/linux-5.10 INSTALL_MOD_PATH=/home/forlinx/work2/OKA40i-linux-sdk/out/a40i_h/kernel/staging去掉部分,然后上面的就是用来编译的指令。 我们进入perf目录,使用该命令:
cd SDK_SOURCE/OKA40i-linux-sdk/kernel/linux-5.10/tools/perf
make CROSS_COMPILE=/home/forlinx/work2/OKA40i-linux-sdk/out/toolchain/gcc-linaro-5.3.1-2016.05-x86_64_arm-linux-gnueabi/bin/arm-linux-gnueabi- ARCH=arm -j8 O=/home/forlinx/work2/OKA40i-linux-sdk/out/a40i_h/kernel/build KERNEL_SRC=/home/forlinx/work2/OKA40i-linux-sdk/kernel/linux-5.10 INSTALL_MOD_PATH=/home/forlinx/work2/OKA40i-linux-sdk/out/a40i_h/kernel/staging
发现这里有问题,让我们按照软件,但是因为是交叉编译,不得不要考虑是不是真的是在本机上安装,因为我尝试在ubuntu按照上面提示安装并没有任何效果。所以我们得查一查检查函数: 选择其中一条打印,如:No sys/sdt.h found, no SDT events are defined, please install systemtap-sdt-devel or systemtap-sdt-dev 搜索关键字:grep -nisr systemtap-sdt-devel,发现: ![]()
检验函数:$(feature-sdt),但是搜索整个源码,并没有找到定义,猜测可能是批量的模式匹配定义,所以我们搜索grep -nswr ‘feature-’,发现:
可能是那个带$(1)的,我们查看一下:
可以确定90%是这个。我们通过去掉$(shell )来打印(下面被注释的就是),然后查看执行的命令,这里挑libelf,来看看检查命令是什么:
# 执行编译perf命令
make CROSS_COMPILE=/home/forlinx/work2/OKA40i-linux-sdk/out/toolchain/gcc-linaro-5.3.1-2016.05-x86_64_arm-linux-gnueabi/bin/arm-linux-gnueabi- ARCH=arm -j8 O=/home/forlinx/work2/OKA40i-linux-sdk/out/a40i_h/kernel/build KERNEL_SRC=/home/forlinx/work2/OKA40i-linux-sdk/kernel/linux-5.10 INSTALL_MOD_PATH=/home/forlinx/work2/OKA40i-linux-sdk/out/a40i_h/kernel/staging
复制命令,在linux5.10/tools/build/feature下执行:
# 去掉了/dev/null
make OUTPUT=/home/forlinx/work2/OKA40i-linux-sdk/out/a40i_h/kernel/build/feature/ CC="/home/forlinx/work2/OKA40i-linux-sdk/out/toolchain/gcc-linaro-5.3.1-2016.05-x86_64_arm-linux-gnueabi/bin/arm-linux-gnueabi-gcc" CXX="/home/forlinx/work2/OKA40i-linux-sdk/out/toolchain/gcc-linaro-5.3.1-2016.05-x86_64_arm-linux-gnueabi/bin/arm-linux-gnueabi-g++" CFLAGS=" " CXXFLAGS=" " LDFLAGS="-Wl,-z,noexecstack " -C /home/forlinx/work2/OKA40i-linux-sdk/kernel/linux-5.10/tools/build/feature /home/forlinx/work2/OKA40i-linux-sdk/out/a40i_h/kernel/build/feature/test-libelf.bin它实际上是进入linux5.10/tools/build/feature编译,我们看看该目录下的Makefile:
打印后如下: 
/home/forlinx/work2/OKA40i-linux-sdk/out/toolchain/gcc-linaro-5.3.1-2016.05-x86_64_arm-linux-gnueabi/bin/arm-linux-gnueabi-gcc -MD -Wall -Werror -o /home/forlinx/work2/OKA40i-linux-sdk/out/a40i_h/kernel/build/feature/test-libelf.bin test-libelf.c -Wl,-z,noexecstack > /home/forlinx/work2/OKA40i-linux-sdk/out/a40i_h/kernel/build/feature/test-libelf.make.output 2>&1 -lelf发现实际上是有输出的,我们查看:/home/forlinx/work2/OKA40i-linux-sdk/out/a40i_h/kernel/build/feature/test-libelf.make.output内容如下:
test-libelf.c:2:20: fatal error: libelf.h: No such file or directory我们尝试在源码内查找:
再次编译:
/home/forlinx/work2/OKA40i-linux-sdk/out/toolchain/gcc-linaro-5.3.1-2016.05-x86_64_arm-linux-gnueabi/bin/arm-linux-gnueabi-gcc -MD -Wall -Werror -o /home/forlinx/work2/OKA40i-linux-sdk/out/a40i_h/kernel/build/feature/test-libelf.bin test-libelf.c -Wl,-z,noexecstack > /home/forlinx/work2/OKA40i-linux-sdk/out/a40i_h/kernel/build/feature/test-libelf.make.output 2>&1 -lelf -I/home/forlinx/work2/OKA40i-linux-sdk/prebuilt/hostbuilt/linux-x86/include显示缺库:
在此查找:
继续编译:
/home/forlinx/work2/OKA40i-linux-sdk/out/toolchain/gcc-linaro-5.3.1-2016.05-x86_64_arm-linux-gnueabi/bin/arm-linux-gnueabi-gcc -MD -Wall -Werror -o /home/forlinx/work2/OKA40i-linux-sdk/out/a40i_h/kernel/build/feature/test-libelf.bin test-libelf.c -Wl,-z,noexecstack > /home/forlinx/work2/OKA40i-linux-sdk/out/a40i_h/kernel/build/feature/test-libelf.make.output 2>&1 -lelf -I/home/forlinx/work2/OKA40i-linux-sdk/prebuilt/hostbuilt/linux-x86/include -L/home/forlinx/work2/OKA40i-linux-sdk/prebuilt/hostbuilt/linux-x86/lib64发现无法打开该库文件,我们使用file /home/forlinx/work2/OKA40i-linux-sdk/prebuilt/hostbuilt/linux-x86/lib64/libelf.so发现是x86_64库文件:
怪不得,错误,所以这要求交叉编译的libelf,且是交叉编译的库,一般在buildroot/out/host下面这是buildroot的交叉编译工具库,所以我们需要在buildroot开启libelf,但是libelf又需要linux kernel,结合上一节问题,发现问题暂时无解。
尝试第三种(在设备上面直接编译)
perf工具来自linux-tools-$(uname -r)包中,但是有时候嵌入式并没办法获取指定的工具,那么此时我们只能交叉编译或者本机编译,交叉编译会面临上面一样的问题,各种库确实,由于交叉编译环境,只能通过交叉编译各种库,并且安装到交叉编译环境中才能正常的制作perf工具。 不过,通过在设备上直接编译可以大大减少难度。 这里测试使用的是:
RK3588Linux-6.6.29先将源码上传至机器,可以参考制作源码包进行打包,完成后,进行如下步骤:
# 解压
tar -xvf linux-upstream_6.6.29-gaf935fbe243f.orig.tar.gz
# 进入源码
cd linux
# 安装环境
apt update
apt install python3 python3-dev python3-distutils
apt install build-essential
# DWARF调试信息支持
apt install libdw-dev libelf-dev
# 其他重要依赖
apt install libssl-dev libslang2-dev libperl-dev
apt install systemtap-sdt-dev libunwind-dev
apt install libtraceevent-dev python3-setuptools libzstd-dev libcap-dev libnuma-dev libbabeltrace-dev libpfm4-dev
# 进入perf源码目录
cd linux/tools/perf
# 编译
make
# 安装
make prefix=/usr/local install
# 或者
make DESTDIR=/usr/local install![[笔记/01 附件/01 附件/Linux分析与调试-Perf工具交叉编译/image.png|image.png]]